package com.angus.modules.content.dto;

import lombok.Data;

import java.lang.reflect.Field;
import java.util.Map;

/**
 * @author lineCode
 */
@Data
public class SysFinanceDto {
    private String startTime;
    private String endTime;
    private String orderNo;
    private Integer payMethod;
    private Integer status;
    private Long recommendCode;
    private String courseCode;
    private String courseName;
    private String courseType;
    private Long userId;

    /**
     * 将Map中的键值对映射到SysFinanceDto对象
     * @param searchExtend 包含参数Map
     * @return 映射后的SysFinanceDto对象
     */
    public static SysFinanceDto mapToDto(Map<String, Object> searchExtend) {
        SysFinanceDto dto = new SysFinanceDto();
        if (searchExtend == null || searchExtend.isEmpty()) {
            return dto;
        }

        // 获取SysFinanceDto的所有字段
        Field[] fields = SysFinanceDto.class.getDeclaredFields();
        for (Field field : fields) {
            // 设置字段可访问（针对private修饰的字段）
            field.setAccessible(true);
            String fieldName = field.getName();

            // 如果Map中包含当前字段名的key，则赋值
            if (searchExtend.containsKey(fieldName)) {
                try {
                    // 获取Map中的值
                    Object value = searchExtend.get(fieldName);
                    // 转换值的类型并设置到对象中
                    setFieldValue(field, dto, value);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException("字段赋值失败：" + fieldName, e);
                }
            }
        }
        return dto;
    }

    /**
     * 为字段设置值（处理类型转换）
     */
    private static void setFieldValue(Field field, SysFinanceDto dto, Object value) throws IllegalAccessException {
        Class<?> fieldType = field.getType();
        // 根据字段类型进行转换
        if (fieldType == String.class) {
            field.set(dto, value != null ? value.toString() : null);
        } else if (fieldType == Integer.class) {
            if (value instanceof Number) {
                field.set(dto, ((Number) value).intValue());
            } else if (value instanceof String) {
                field.set(dto, Integer.parseInt((String) value));
            }
        } else if (fieldType == Long.class) {
            if (value instanceof Number) {
                field.set(dto, ((Number) value).longValue());
            } else if (value instanceof String) {
                field.set(dto, Long.parseLong((String) value));
            }
        }
        // 可根据需要扩展其他类型（如Boolean、Date等）
    }
}
